const path = require("path");
const ejs = require("ejs");
const { promisify } = require("util");
const fs = require("fs-extra");

const renderTemplate = async (templatePath, data) => {
  // 封装ejs.renderFile为异步函数
  return new Promise((resolve, reject) => {
    ejs.renderFile(templatePath, { data }, {}, (err, result) => {
      if (err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
  });
};
const compile = async (templateName, data) => {
  // 验证templateName的有效性
  if (
    !templateName ||
    typeof templateName !== "string" ||
    templateName.trim() === ""
  ) {
    throw new Error("TemplateName is invalid.");
  }

  const regex = /\.(png|ico)$/i;
  const templatePosition = `./${templateName}`;
  const templatePath = path.resolve(__dirname, templatePosition);

  // 检查文件是否为指定的图片类型
  if (regex.test(templatePath)) {
    try {
      const result = await fs.promises.readFile(templatePath);
      return result;
    } catch (err) {
      // 处理文件读取错误
      console.error(`Error reading file: ${err.message}`);
      throw err; // 可以选择重新抛出异常，或者处理异常
    }
  } else {
    // 对于非图片文件，使用ejs渲染模板
    try {
      const result = await renderTemplate(templatePath, data);
      return result;
    } catch (err) {
      // 处理模板渲染错误
      console.error(`Error rendering template: ${err.message}`);
      throw err;
    }
  }
};

async function extract(configTemplate) {
  for await (const template of configTemplate) {
    const result = await compile(`config/${template}`, this.rootOptions);
    this.files[template] = result;
  }
}

async function fileDisplay(filePath, filesPath = [], resolvePath = []) {
  try {
    // 使用异步读取文件夹内容
    const files = await fs.promises.readdir(filePath);

    for (const filename of files) {
      // 使用let代替var，保证作用域在块级
      let filedir = path.join(filePath, filename);
      // 简化赋值逻辑
      let currentPath = resolvePath.length
        ? resolvePath.concat(filename)
        : [filename];

      // 使用异步获取文件信息
      const stats = await fs.promises.stat(filedir);

      // 使用const声明不会修改的变量
      const isFile = stats.isFile();
      const isDir = stats.isDirectory();

      if (isFile) filesPath.push(currentPath);

      if (isDir) {
        // 递归调用，使用async函数避免栈溢出
        await fileDisplay(filedir, filesPath, currentPath);
      }
    }
  } catch (error) {
    console.error("An error occurred:", error);
  }
}

module.exports = {
  compile,
  extract,
  fileDisplay,
};
